package antlr4.myantlrtest.test.grammarsv4.protobuf3.test;

import antlr4.myantlrtest.gen.grammarsv4.protobuf3.Protobuf3BaseListener;
import antlr4.myantlrtest.gen.grammarsv4.protobuf3.Protobuf3Parser;

public class Protobuf3Listener extends Protobuf3BaseListener {
    Protobuf3Parser parser;

    public Protobuf3Listener(Protobuf3Parser parser) {
        this.parser = parser;
    }

    @Override
    public void enterProto(Protobuf3Parser.ProtoContext ctx) {
//        System.out.println("enterProto");
    }

    @Override
    public void exitProto(Protobuf3Parser.ProtoContext ctx) {
//        System.out.println("exitProto");
    }

    @Override
    public void enterPackageStatement(Protobuf3Parser.PackageStatementContext ctx) {
        System.out.println(ctx.fullIdent().getText());
    }

    @Override
    public void enterOptionStatement(Protobuf3Parser.OptionStatementContext ctx) {
        System.out.println(ctx.OPTION().getText() + " " + ctx.optionName().getText() + " = " + ctx.constant().getText());
//        if (ctx.optionName().getText().equals("mul")) {
//            //多文件处理
//        }
    }

    @Override
    public void enterMessageDef(Protobuf3Parser.MessageDefContext ctx) {
        System.out.println("message " + ctx.messageName().getText() +" {");
    }

    @Override
    public void exitMessageDef(Protobuf3Parser.MessageDefContext ctx) {
        System.out.println("}");
    }

    //基本类型，数字类型和字符串类型字段
    @Override
    public void enterField(Protobuf3Parser.FieldContext ctx) {
        if (ctx.type_() != null && ctx.fieldName() != null && ctx.fieldNumber() != null) {
            System.out.printf("%s %s %s %s;%n", ctx.fieldLabel() == null ? "" : " " + ctx.fieldLabel().getText(), ctx.type_().getText(), ctx.fieldName().getText(), ctx.fieldNumber().getText());
        }
    }

    //map类型
    @Override
    public void enterMapField(Protobuf3Parser.MapFieldContext ctx) {
        if (ctx.MAP() != null && ctx.keyType() != null && ctx.type_() != null && ctx.mapName() != null && ctx.fieldNumber() != null) {
            System.out.printf(" %s<%s,%s> %s = %s;%n", ctx.MAP().getText(), ctx.keyType().getText(), ctx.type_().getText(), ctx.mapName().getText(), ctx.fieldNumber().getText());
        }
    }

    //oneOf类型
    @Override
    public void enterOneofField(Protobuf3Parser.OneofFieldContext ctx) {
        System.err.println(ctx.getText() + " oneOf类型目前不支持处理");
//        if (ctx.type_() != null && ctx.fieldName() != null && ctx.fieldNumber() != null) {
//            System.out.printf("%s %s %s %s;%n", ctx.fieldLabel() == null ? "" : ctx.fieldLabel().getText(), ctx.type_().getText(), ctx.fieldName().getText(), ctx.fieldNumber().getText());
//        }
    }

    @Override
    public void enterEnumDef(Protobuf3Parser.EnumDefContext ctx) {
        System.out.println("enum " + ctx.enumName().getText() +" {");
    }

    @Override
    public void exitEnumDef(Protobuf3Parser.EnumDefContext ctx) {
        System.out.println("}");
    }

    //枚举类型
    @Override
    public void enterEnumField(Protobuf3Parser.EnumFieldContext ctx) {
        if (ctx.ident() != null && ctx.intLit() != null) {
            System.out.printf("%s = %s;%n", ctx.ident().getText(), ctx.intLit().getText());
        }
    }
}
